Code to Analyze our CSV file
#Formatting the variable date as mdy and ordering it
ourfinaldata$Date <-as.Date(ourfinaldata$Date, format = "%m/%d/%y")
#One Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed,na.rm = TRUE), Dead_count = sum(Deaths,na.rm = TRUE)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group=1, size = Dead_count)) + ggtitle("World Cases and Deaths Graph 1")

#Another Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed,na.rm = TRUE), Dead_count = sum(Deaths,na.rm = TRUE)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group = 1), linetype = "dashed") + geom_line(aes(x = Date, y = Dead_count, group = 1), color = "red")+ ggtitle("World Cases and Deaths Graph 2")

#Deaths in China
ourfinaldata %>% filter(Country_Region == "China") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("China Cases and Deaths")

#Deaths in United States
ourfinaldata %>% filter(Country_Region == "United States") %>% group_by(Date) %>% arrange(Date)%>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United States Cases and Deaths")

USA_trends = ourfinaldata %>% filter(Country_Region == "United States") %>% group_by(Date) %>% arrange(Date)
write_csv(USA_trends, "USA_trends.csv")
#Deaths in South Korea
ourfinaldata %>% filter(Country_Region == "South Korea") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Korea Cases and Deaths")

#Deaths in Italy
ourfinaldata %>% filter(Country_Region == "Italy") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Italy Cases and Deaths")

#Deaths in Spain
ourfinaldata %>% filter(Country_Region == "Spain") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Spain Cases and Deaths")

#Deaths in Iran
ourfinaldata %>% filter(Country_Region == "Iran") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iran Cases and Deaths")

#Deaths in Sweeden
ourfinaldata %>% filter(Country_Region == "Sweden") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Sweden Cases and Deaths")

#Deaths in Canada
ourfinaldata %>% filter(Country_Region == "Canada") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Canada Cases and Deaths")

#Deaths in Japan
ourfinaldata %>% filter(Country_Region == "Japan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Japan Cases and Deaths")

#Deaths in Costa Rica
ourfinaldata %>% filter(Country_Region == "Costa Rica") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Costa Rica Cases and Deaths")

#Deaths in Germany
ourfinaldata %>% filter(Country_Region == "Germany") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Germany Cases and Deaths")

#Deaths in United Kingdom
ourfinaldata %>% filter(Country_Region == "United Kingdom"& is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United Kingdom Cases and Deaths")

#Deaths in France
ourfinaldata %>% filter(Country_Region == "France" & is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("France Cases and Deaths")

#Russia
ourfinaldata %>% filter(Country_Region == "Russia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Russia Cases and Deaths")

#Egypt
ourfinaldata %>% filter(Country_Region == "Egypt") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Egypt Cases and Deaths")

#South Africa
ourfinaldata %>% filter(Country_Region == "South Africa") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Africa Cases and Deaths")

#Finlad
ourfinaldata %>% filter(Country_Region == "Finland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Finland Cases and Deaths")

#Austria
ourfinaldata %>% filter(Country_Region == "Austria") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Austria Cases and Deaths")

#Portugal
ourfinaldata %>% filter(Country_Region == "Portugal") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Portugal Cases and Deaths")

#Indonesia
ourfinaldata %>% filter(Country_Region == "Indonesia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Indonesia Cases and Deaths")

#Australia
ourfinaldata %>% filter(Country_Region == "Australia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Australia Cases and Deaths")

#Mexico
ourfinaldata %>% filter(Country_Region == "Mexico") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Mexico Cases and Deaths")

#Serbia
ourfinaldata %>% filter(Country_Region == "Serbia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Serbia Cases and Deaths")

#Iceland
ourfinaldata %>% filter(Country_Region == "Iceland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iceland Cases and Deaths")

#Afghanistan
ourfinaldata %>% filter(Country_Region == "Afghanistan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Afghanistan Cases and Deaths")

#Norway
ourfinaldata %>% filter(Country_Region == "Norway") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Norway Cases and Deaths")

#Comparison of Total Cases in each country
ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea"|Country_Region == "Canada" ) %>% ggplot(mapping = aes(x=Date,y = Confirmed, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Cases Over Time")

ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea"|Country_Region == "Canada") %>% ggplot(mapping = aes(x=Date,y = Deaths, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Deaths Over Time")

Plots of the Percentage of Population Infected
#Note the y-axis for these graphs should be 0-100 because calculated as a percent but this shows how few people have it at this point
#USA
ourfinaldata %>%filter(Country_Region == "United States") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in the USA")

#China
ourfinaldata %>%filter(Country_Region == "China") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in China")

#Italy
ourfinaldata %>%filter(Country_Region == "Italy") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Italy")

#Spain
ourfinaldata %>%filter(Country_Region == "Spain") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Spain")

#India
ourfinaldata %>%filter(Country_Region == "India") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in India")

#Iran
ourfinaldata %>%filter(Country_Region == "Iran") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Iran")

#South Africa
ourfinaldata %>%filter(Country_Region == "South Africa") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in South Africa")

LS0tCnRpdGxlOiAiQ29yb25vdmlydXNfRmluYWxQcm9qZWN0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpQb3B1bGF0aW9uCkdEUApBdmcgVGVtcGVyYXR1cmUKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShhbmNob3JzKQpsaWJyYXJ5KG1vZGVybmRpdmUpCmBgYAoKI0NvZGUgdG8gU2V0IFVwIG91ciBDU1YgZmlsZQpUaGUgY29kZSBpbiB0aGlzIGNodW5rIGJlbG93IHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBmb3IgY291bnRyaWVzIHRoYXQgYXJlIGJyb2tlbiBpbnRvIHJlZ2lvbnMgc28gd2UgY2FuIGhhdmUgb25lIHZhbHVlIHBlciByb3cgZm9yIHRob3NlIGNvdW50cmllcy4gIFdlIGhhZCB0byBkbyB0aGlzIGZvciB0aGUgVVMsIENoaW5hLCBhbmQgQXVzdHJhbGlhLgpgYGB7cn0KdmlydXMgPSByZWFkX2NzdigiY292aWRfMTlfY2xlYW5fY29tcGxldGUuY3N2IikKdmlydXMgPC0gcmVwbGFjZS52YWx1ZSh2aXJ1cywiQ291bnRyeV9SZWdpb24iLGZyb20gPSAiVVMiLHRvID0gIlVuaXRlZCBTdGF0ZXMiKSAjUmVwbGFjaW5nIHZhbHVlIG9mIFVTIHdpdGggdmFsdWUgVW5pdGVkIFN0YXRlcwoKI1VTX3ZpcnVzIGlzIHRoZSBkYXRhIHdpdGggdGhlIGNydWlzZSBzaGlwcyBmaWx0ZXJlZCBvdXQgYW5kIHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBpbiBlYWNoIGNvdW50eSBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgdG90YWwgbnVtYmVyIG9mIGNhc2VzIGdyb3VwZWQgYnkgZGF0ZQojTm9fVVNfdmlydXMgaXMgdGhlIGRhdGEgd2l0aG91dCB0aGUgVVMgYW5kIGlzIGp1c3QgZm9yIGFsbCB0aGUgb3RoZXIgY291bnRyaWVzCiNjb3VudHJ5X3ZpcnVzIGlzIHRoZSBmaW5hbCBkYXRhc2V0IGdyb3VwZWQgYnkgY291bnRyeQoKCiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVTIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSAhPSAiR3JhbmQgUHJpbmNlc3MgQ3J1aXNlIFNoaXAiLFByb3ZpbmNlX1N0YXRlICE9ICJPbWFoYSwgTkUgKEZyb20gRGlhbW9uZCBQcmluY2VzcykiLFByb3ZpbmNlX1N0YXRlICE9ICJUcmF2aXMsIENBIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiTGFja2xhbmQsIFRYIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiVW5hc3NpZ25lZCBMb2NhdGlvbiAoRnJvbSBEaWFtb25kIFByaW5jZXNzKSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpLCBSZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIlVTIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVUyIpICNPTEQgREFUU0VUIENPREU7IG5ldyBkYXRhc2V0IGJyb2tlbiBpbnRvIGNpdGllcyBhbmQgY291bnRyaWVzCgojQ29kZSBmb3IgU2Vjb25kIFZlcnNpb24gb2YgRGF0YXNldCB1bnRpbCAzLzI1CiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc2VwYXJhdGUoY29sID0gUHJvdmluY2VfU3RhdGUsIGludG8gPSBjKCJDaXR5X29yX0NvdW50eSIsIlN0YXRlIiksc2VwID0gIiwiKSAlPiUgZmlsdGVyKGlzLm5hKFN0YXRlKT09IFQpJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSwgUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCkpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKVVNfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIiklPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHNlcGFyYXRlKGNvbCA9IFByb3ZpbmNlX1N0YXRlLCBpbnRvID0gYygiQ2l0eV9vcl9Db3VudHkiLCJTdGF0ZSIpLHNlcCA9ICIsIikgJT4lIGZpbHRlcihpcy5uYShTdGF0ZSk9PSBUKSU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKCk5vX1VTX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIixDb3VudHJ5X1JlZ2lvbiAhPSAiQXVzdHJhbGlhIixDb3VudHJ5X1JlZ2lvbiAhPSAiQ2FuYWRhIikKCmNvdW50cnlfdmlydXMgPSBmdWxsX2pvaW4oTm9fVVNfdmlydXMsIFVTX3ZpcnVzKQpjb3VudHJ5X3ZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKQoKI0ZvciBDaGluYQpDaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJDaGluYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2hpbmEiKQpOb19DaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIlVuaXRlZCBTdGF0ZXMiLENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMSA9IGZ1bGxfam9pbihOb19DaGluYV92aXJ1cywgQ2hpbmFfdmlydXMpCgojRm9yIENhbmFkYQpDYW5hZGFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIkNhbmFkYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2FuYWRhIikKTm9fQ2FuYWRhX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiQ2hpbmEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkF1c3RyYWxpYSIsIENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMTEgPSBmdWxsX2pvaW4oTm9fQ2FuYWRhX3ZpcnVzLCBDYW5hZGFfdmlydXMpCgojRm9yIEF1c3RyYWxpYQpBdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJBdXN0cmFsaWEiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpKSAlPiUgbXV0YXRlKCJQcm92aW5jZV9TdGF0ZSIgPSAiQXVzdHJhbGlhIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJBdXN0cmFsaWEiKQpOb19BdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIkNhbmFkYSIpCmNvdW50cnlfdmlydXMyID0gZnVsbF9qb2luKE5vX0F1c3RyYWxpYV92aXJ1cywgQXVzdHJhbGlhX3ZpcnVzKQoKcHJlZGF0YSA9IGZ1bGxfam9pbihjb3VudHJ5X3ZpcnVzLGNvdW50cnlfdmlydXMxKQpteWRhdGEgPSBmdWxsX2pvaW4ocHJlZGF0YSxjb3VudHJ5X3ZpcnVzMikKbXlkYXRhMiA9IGZ1bGxfam9pbihteWRhdGEsY291bnRyeV92aXJ1czExKQojbXlkYXRhMiAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKQpgYGAKCmBgYHtyfQpteWRhdGEyCiNHRFBhbmRXZWF0aGVyID0gR0RQYW5kV2VhdGhlciAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCkdEUGFuZFdlYXRoZXIKcGFydGlhbGRhdGEgPSBsZWZ0X2pvaW4obXlkYXRhMixHRFBhbmRXZWF0aGVyLGJ5ID0gIkNvdW50cnlfUmVnaW9uIikKY291bnRyeV9wb3B1bGF0aW9uXzIgPSBjb3VudHJ5X3BvcHVsYXRpb25fMSAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCm91cmZpbmFsZGF0YSA9IGxlZnRfam9pbihwYXJ0aWFsZGF0YSxjb3VudHJ5X3BvcHVsYXRpb25fMiwgYnkgPSAiQ291bnRyeV9SZWdpb24iKQoKYGBgCgpGaWx0ZXIgYnkgdGhlIHByZXZpb3VzIGRheSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbW9zdCByZWNlbnQgZGF0YS4KYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikKCm91cmZpbmFsZGF0YQpwb3N0ZXIgPSBvdXJmaW5hbGRhdGEgJT4lIGRwbHlyOjpzZWxlY3QoLVByb3ZpbmNlX1N0YXRlLC1SZWNvdmVyZWQpCmBgYAoKCmBgYHtyfQp3cml0ZV9jc3Yob3VyZmluYWxkYXRhLCAib3VyZmluYWxkYXRhLmNzdiIpCmxpYnJhcnkobHVicmlkYXRlKQpgYGAKCiNDb2RlIHRvIEFuYWx5emUgb3VyIENTViBmaWxlCgpgYGB7cn0KI0Zvcm1hdHRpbmcgdGhlIHZhcmlhYmxlIGRhdGUgYXMgbWR5IGFuZCBvcmRlcmluZyBpdApvdXJmaW5hbGRhdGEkRGF0ZSA8LWFzLkRhdGUob3VyZmluYWxkYXRhJERhdGUsIGZvcm1hdCA9ICIlbS8lZC8leSIpCiNPbmUgUGxvdCBvZiBXb3JsZCBEZWF0aHMKb3VyZmluYWxkYXRhICU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCxuYS5ybSA9IFRSVUUpLCBEZWFkX2NvdW50ID0gc3VtKERlYXRocyxuYS5ybSA9IFRSVUUpKSAlPiUgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gVG90YWwsZ3JvdXA9MSwgc2l6ZSA9IERlYWRfY291bnQpKSArICBnZ3RpdGxlKCJXb3JsZCBDYXNlcyBhbmQgRGVhdGhzIEdyYXBoIDEiKQoKI0Fub3RoZXIgUGxvdCBvZiBXb3JsZCBEZWF0aHMKb3VyZmluYWxkYXRhICU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCxuYS5ybSA9IFRSVUUpLCBEZWFkX2NvdW50ID0gc3VtKERlYXRocyxuYS5ybSA9IFRSVUUpKSAlPiUgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gVG90YWwsZ3JvdXAgPSAxKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYWRfY291bnQsIGdyb3VwID0gMSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJXb3JsZCBDYXNlcyBhbmQgRGVhdGhzIEdyYXBoIDIiKQoKI0RlYXRocyBpbiBDaGluYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2hpbmEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkNoaW5hIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBVbml0ZWQgU3RhdGVzCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBhcnJhbmdlKERhdGUpJT4lIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiVW5pdGVkIFN0YXRlcyBDYXNlcyBhbmQgRGVhdGhzIikKVVNBX3RyZW5kcyA9IG91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBhcnJhbmdlKERhdGUpCndyaXRlX2NzdihVU0FfdHJlbmRzLCAiVVNBX3RyZW5kcy5jc3YiKSAKCiNEZWF0aHMgaW4gU291dGggS29yZWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEtvcmVhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTb3V0aCBLb3JlYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gSXRhbHkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJJdGFseSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gU3BhaW4Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNwYWluIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTcGFpbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gSXJhbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiSXJhbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gU3dlZWRlbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU3dlZGVuIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTd2VkZW4gQ2FzZXMgYW5kIERlYXRocyIpCmBgYAoKYGBge3J9CiNEZWF0aHMgaW4gQ2FuYWRhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkNhbmFkYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gSmFwYW4Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkphcGFuIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJKYXBhbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gQ29zdGEgUmljYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ29zdGEgUmljYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQ29zdGEgUmljYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gR2VybWFueQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiR2VybWFueSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiR2VybWFueSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gVW5pdGVkIEtpbmdkb20Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBLaW5nZG9tIiYgaXMubmEoUHJvdmluY2VfU3RhdGUpKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlVuaXRlZCBLaW5nZG9tIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBGcmFuY2UKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkZyYW5jZSIgJiBpcy5uYShQcm92aW5jZV9TdGF0ZSkpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiRnJhbmNlIENhc2VzIGFuZCBEZWF0aHMiKQoKI1J1c3NpYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiUnVzc2lhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJSdXNzaWEgQ2FzZXMgYW5kIERlYXRocyIpCgojRWd5cHQKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkVneXB0IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJFZ3lwdCBDYXNlcyBhbmQgRGVhdGhzIikKCiNTb3V0aCBBZnJpY2EKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEFmcmljYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiU291dGggQWZyaWNhIENhc2VzIGFuZCBEZWF0aHMiKQpgYGAKCgpgYGB7cn0KI0ZpbmxhZApvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiRmlubGFuZCIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiRmlubGFuZCBDYXNlcyBhbmQgRGVhdGhzIikKCiNBdXN0cmlhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJBdXN0cmlhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJBdXN0cmlhIENhc2VzIGFuZCBEZWF0aHMiKQoKI1BvcnR1Z2FsCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJQb3J0dWdhbCIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiUG9ydHVnYWwgQ2FzZXMgYW5kIERlYXRocyIpCgojSW5kb25lc2lhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJbmRvbmVzaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkluZG9uZXNpYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNBdXN0cmFsaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkF1c3RyYWxpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQXVzdHJhbGlhIENhc2VzIGFuZCBEZWF0aHMiKQoKI01leGljbwpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiTWV4aWNvIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJNZXhpY28gQ2FzZXMgYW5kIERlYXRocyIpCgpgYGAKCmBgYHtyfQojU2VyYmlhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJTZXJiaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlNlcmJpYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNJY2VsYW5kCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJY2VsYW5kIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJJY2VsYW5kIENhc2VzIGFuZCBEZWF0aHMiKQoKI0FmZ2hhbmlzdGFuCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJBZmdoYW5pc3RhbiIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQWZnaGFuaXN0YW4gQ2FzZXMgYW5kIERlYXRocyIpCgojTm9yd2F5Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJOb3J3YXkiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIk5vcndheSBDYXNlcyBhbmQgRGVhdGhzIikKYGBgCgpgYGB7cn0KI0NvbXBhcmlzb24gb2YgVG90YWwgQ2FzZXMgaW4gZWFjaCBjb3VudHJ5Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzInxDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkifENvdW50cnlfUmVnaW9uPT0iQ2hpbmEifENvdW50cnlfUmVnaW9uID09ICJTcGFpbiJ8Q291bnRyeV9SZWdpb24gPT0gIklyYW4ifENvdW50cnlfUmVnaW9uID09ICJBdXN0cmFsaWEifENvdW50cnlfUmVnaW9uID09ICJTb3V0aCBLb3JlYSJ8Q291bnRyeV9SZWdpb24gPT0gIkNhbmFkYSIgKSAlPiUgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeD1EYXRlLHkgPSBDb25maXJtZWQsIGNvbG9yID0gQ291bnRyeV9SZWdpb24pKStnZW9tX2xpbmUoKSArZ2d0aXRsZSgiVG90YWwgQ29uZmlybWVkIENhc2VzIE92ZXIgVGltZSIpCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzInxDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkifENvdW50cnlfUmVnaW9uPT0iQ2hpbmEifENvdW50cnlfUmVnaW9uID09ICJTcGFpbiJ8Q291bnRyeV9SZWdpb24gPT0gIklyYW4ifENvdW50cnlfUmVnaW9uID09ICJBdXN0cmFsaWEifENvdW50cnlfUmVnaW9uID09ICJTb3V0aCBLb3JlYSJ8Q291bnRyeV9SZWdpb24gPT0gIkNhbmFkYSIpICU+JSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4PURhdGUseSA9IERlYXRocywgY29sb3IgPSBDb3VudHJ5X1JlZ2lvbikpK2dlb21fbGluZSgpICtnZ3RpdGxlKCJUb3RhbCBDb25maXJtZWQgRGVhdGhzIE92ZXIgVGltZSIpCmBgYAoKCgpQbG90cyBvZiB0aGUgUGVyY2VudGFnZSBvZiBQb3B1bGF0aW9uIEluZmVjdGVkCmBgYHtyfQoKI05vdGUgdGhlIHktYXhpcyBmb3IgdGhlc2UgZ3JhcGhzIHNob3VsZCBiZSAwLTEwMCBiZWNhdXNlIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IGJ1dCB0aGlzIHNob3dzIGhvdyBmZXcgcGVvcGxlIGhhdmUgaXQgYXQgdGhpcyBwb2ludAojVVNBCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiB0aGUgVVNBIikKCiNDaGluYQpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDaGluYSIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIENoaW5hIikKCiNJdGFseQpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJdGFseSIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIEl0YWx5IikKCiNTcGFpbgpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJTcGFpbiIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIFNwYWluIikKCiNJbmRpYQpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJbmRpYSIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIEluZGlhIikKCiNJcmFuCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIklyYW4iKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBJcmFuIikKCiNTb3V0aCBBZnJpY2EKb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU291dGggQWZyaWNhIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gU291dGggQWZyaWNhIikKYGBgCgoKI0xvZ2lzdGljIEdyb3d0aCBmb3IgSXRhbHkKYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJdGFseSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiSXRhbHkgQ2FzZXMgYW5kIERlYXRocyIpCgpudW1fZGF5c19JdGFseSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IixDb25maXJtZWQgPj0xKSkKSXRhbHlfZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IixDb25maXJtZWQgPj0xKSAlPiUgbXV0YXRlKCJOdW1fRGF5c19TaW5jZV9TdGFydCI9YygxOm51bV9kYXlzX0l0YWx5KSkKCkl0YWx5X21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTEwMCwgYiA9IC0wLjEzLCBjID0gbWF4KEl0YWx5X2RhdCRDb25maXJtZWQpKSwgZGF0YSA9IEl0YWx5X2RhdCkKY29lZihzdW1tYXJ5KEl0YWx5X21vZCkpCgpwbG90KEl0YWx5X2RhdCROdW1fRGF5c19TaW5jZV9TdGFydCxJdGFseV9kYXQkQ29uZmlybWVkLHhsYWIgPSAiTnVtYmVyIG9mIERheXMgU2luY2UgU3RhcnQiLHlsYWIgPSAiTnVtYmVyIG9mIENvbmZpcm1lZCBDYXNlcyIsbWFpbiA9ICJMb2dpc3RpYyBSZWdyZXNzaW9uIGZvciBJdGFseSIpCmN1cnZlKDIuMTQ1OTc3ZSswNS8oMSs2OTIuMipleHAoeCotMC4xMDQpKSwgY29sID0gImJsdWUiLCBhZGQgPSBUUlVFKQojbGluZXMoSXRhbHlfZGF0JE51bV9EYXlzX1NpbmNlX1N0YXJ0LCBwcmVkaWN0KEl0YWx5X21vZCksIGNvbCA9IDIpCgoKYGBgCgojTG9naXN0aWMgR3Jvd3RoIGZvciBVbml0ZWQgU3RhdGVzCmBgYHtyfQpudW1fZGF5c19VU0EgPSBucm93KG91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIixDb25maXJtZWQgPjEpKQpVU0FfZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiLENvbmZpcm1lZCA+MSkgJT4lIG11dGF0ZSgiTnVtX0RheXNfU2luY2VfU3RhcnQiPWMoMTpudW1fZGF5c19VU0EpKSAlPiUgYXJyYW5nZShEYXRlKQoKI1VzaW5nIE5vbmxpbmVhciBMZWFzdCBTcXVhcmVzIExvZ2lzdGljIEdyb3d0aCBNb2RlbAojVVNBX21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTMwMDAwLjMsIGIgPSAtMC4xMCwgYyA9IG1heChVU0FfZGF0JENvbmZpcm1lZCkpLCBkYXRhID0gVVNBX2RhdCkKI2NvZWYoc3VtbWFyeShVU0FfbW9kKSkKYGBgCgojTG9naXN0aWMgR3Jvd3RoIGZvciBDaGluYQpgYGB7cn0KbnVtX2RheXNfQ2hpbmEgPSBucm93KG91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDaGluYSIsQ29uZmlybWVkID4zKSkKQ2hpbmFfZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIixDb25maXJtZWQgPjMpICU+JSBtdXRhdGUoIk51bV9EYXlzX1NpbmNlX1N0YXJ0Ij1jKDE6bnVtX2RheXNfQ2hpbmEpKSAlPiUgYXJyYW5nZShEYXRlKQoKI1VzaW5nIE5vbmxpbmVhciBMZWFzdCBTcXVhcmVzIExvZ2lzdGljIEdyb3d0aCBNb2RlbApDaGluYV9tb2QgPSBubHMoQ29uZmlybWVkIH4gIGMvKDErYSpleHAoYipOdW1fRGF5c19TaW5jZV9TdGFydCkpLCBzdGFydCA9IGxpc3QoYT02NS4yOSwgYiA9IC0wLjIyMywgYyA9IDgzNzg3KSwgZGF0YSA9IENoaW5hX2RhdCkKY29lZihzdW1tYXJ5KENoaW5hX21vZCkpCgoKcGxvdChDaGluYV9kYXQkTnVtX0RheXNfU2luY2VfU3RhcnQsQ2hpbmFfZGF0JENvbmZpcm1lZCx4bGFiID0gIk51bWJlciBvZiBEYXlzIFNpbmNlIFN0YXJ0Iix5bGFiID0gIk51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMiLG1haW4gPSAiTG9naXN0aWMgUmVncmVzc2lvbiBmb3IgQ2hpbmEiKQpjdXJ2ZSg3NzEzMS4yNi8oMSs0NzkuMTUqZXhwKHgqLTAuNDgwKSksIGNvbCA9ICJibHVlIiwgYWRkID0gVFJVRSkKYGBgCgojTG9naXN0aWMgR3Jvd3RoIGZvciBTcGFpbgpgYGB7cn0KbnVtX2RheXNfU3BhaW4gPSBucm93KG91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJTcGFpbiIsQ29uZmlybWVkID4zKSkKU3BhaW5fZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNwYWluIixDb25maXJtZWQgPjMpICU+JSBtdXRhdGUoIk51bV9EYXlzX1NpbmNlX1N0YXJ0Ij1jKDE6bnVtX2RheXNfU3BhaW4pKSAlPiUgYXJyYW5nZShEYXRlKQoKI1VzaW5nIE5vbmxpbmVhciBMZWFzdCBTcXVhcmVzIExvZ2lzdGljIEdyb3d0aCBNb2RlbApTcGFpbl9tb2QgPSBubHMoQ29uZmlybWVkIH4gIGMvKDErYSpleHAoYipOdW1fRGF5c19TaW5jZV9TdGFydCkpLCBzdGFydCA9IGxpc3QoYT0zMC4yOSwgYiA9IC0wLjIwLCBjID0gMTkxNzI2KSwgZGF0YSA9IFNwYWluX2RhdCkKY29lZihzdW1tYXJ5KFNwYWluX21vZCkpCmBgYAoKI0NvdW50eS9TdGF0ZSBEYXRhIGZvciBVUwoKYGBge3J9Cm15X2NvdW50aWVzID0gcmVhZF9jc3YoInVzYV9jb3VudHlfd2lzZS5jc3YiKQpteV9jb3VudGllcyREYXRlIDwtYXMuRGF0ZShteV9jb3VudGllcyREYXRlLCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpteV9jb3VudGllcyAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJQZW5uc3lsdmFuaWEiICYgRGF0ZSA9PSAiMjAyMC0wNi0wMyIpCgpteV9jb3VudGllcyAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJQZW5uc3lsdmFuaWEifFByb3ZpbmNlX1N0YXRlID09ICJOZXcgWW9yayJ8UHJvdmluY2VfU3RhdGUgPT0gIk5ldyBKZXJzZXkifFByb3ZpbmNlX1N0YXRlID09ICJEZWxhd2FyZSJ8UHJvdmluY2VfU3RhdGUgPT0gIkNhbGlmb3JuaWEifFByb3ZpbmNlX1N0YXRlID09ICJNaWNoaWdhbiJ8UHJvdmluY2VfU3RhdGUgPT0gIkxvdWlzaWFuYSIpICU+JSBncm91cF9ieShEYXRlLFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gc3RhdGVfdG90YWwsY29sb3IgPSBQcm92aW5jZV9TdGF0ZSkpK2dlb21fbGluZSgpK2dndGl0bGUoIkNvbmZpcm1lZCBDYXNlcyBhY3Jvc3MgdGhlIFN0YXRlcyIpCgoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihEYXRlID09ICIyMDIwLTA2LTAzIikgJT4lIGdyb3VwX2J5KFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpICU+JSB0b3BfbihzdGF0ZV90b3RhbCxuPTIwKSAlPiUgYXJyYW5nZShkZXNjKHN0YXRlX3RvdGFsKSkKbXlfY291bnRpZXMgJT4lIGZpbHRlcihEYXRlID09ICIyMDIwLTA2LTAzIikgJT4lIGdyb3VwX2J5KFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpICU+JSB0b3BfbihzdGF0ZV90b3RhbCxuPS0yMCkgJT4lIGFycmFuZ2UoZGVzYyhzdGF0ZV90b3RhbCkpCgoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIikgJT4lZmlsdGVyKEFkbWluMiA9PSAiTGVoaWdoInxBZG1pbjIgID09ICJOb3J0aGFtcHRvbiJ8QWRtaW4yID09ICJCZXJrcyJ8QWRtaW4yID09ICJMdXplcm5lIikgJT4lIGdyb3VwX2J5KEFkbWluMikgJT4lIHRvcF9uKENvbmZpcm1lZCwyMCklPiVnZ3Bsb3QoYWVzKHggPSBEYXRlLHkgPSBDb25maXJtZWQsY29sb3IgPSBBZG1pbjIpKStnZW9tX2xpbmUoKQoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIikgJT4lIGFycmFuZ2UoZGVzYyhEYXRlKSkKYGBgCgojRGV2ZWxvcGluZyBDb3VudHJpZXMKTGlzdCBvZiBkZXZlbG9waW5nIGNvdW50cmllcyBpbiBvdXIgZGF0YXNldDoKQ2hhZCwgQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljLCBCaHV0YW4sIEFmZ2hhbmlzdGFuLCBNYWxpLCBNYWxhd2ksIEVyaXRyZWEsIEhhaXRpLCBCZW5pbiwgTmlnZXIsIExhb3MsIEd1aW5lYSwgQ2FtYm9kaWEsIE1hdXJpdGFuaWEsIExpYmVyaWEsIEJhbmdsYWRlc2gsIEdlb3JnaWEsIFBhbmFtYSwgQnVsZ2FyaWEKCiNMb2dpc3RpYyBHcm93dGggZm9yIERldmVsb3BpbmcgQ291bnRyaWVzCkxvZ2lzdGljIEdyb3d0aCBmb3IgQnVsZ2FyaWEKYGBge3J9CiNCdWxnYXJpYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQnVsZ2FyaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkJ1bGdhcmlhIENhc2VzIGFuZCBEZWF0aHMiKQoKbnVtX2RheXNfQnVsZ2FyaWEgPSBucm93KG91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJCdWxnYXJpYSIsQ29uZmlybWVkID4zKSkKQnVsZ2FyaWFfZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkJ1bGdhcmlhIixDb25maXJtZWQgPj0xKSAlPiUgbXV0YXRlKCJOdW1fRGF5c19TaW5jZV9TdGFydCI9YygxOm51bV9kYXlzX0J1bGdhcmlhKSkKCkJ1bGdhcmlhX21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTE2LjcsIGIgPSAtMC4xNDg5LCBjID0gNzg4Ljc2KSwgZGF0YSA9IEJ1bGdhcmlhX2RhdCkKY29lZihzdW1tYXJ5KEJ1bGdhcmlhX21vZCkpCgpgYGAKCiNDYW1ib2RpYSBMb2dpc3RpYyBHcm93dGgKYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW1ib2RpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQ2FtYm9kaWEgQ2FzZXMgYW5kIERlYXRocyIpCgpudW1fZGF5c19DYW1ib2RpYSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNhbWJvZGlhIixDb25maXJtZWQgPj0xKSkKQ2FtYm9kaWFfZGF0ID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNhbWJvZGlhIixDb25maXJtZWQgPj0xKSAlPiUgbXV0YXRlKCJOdW1fRGF5c19TaW5jZV9TdGFydCI9YygxOm51bV9kYXlzX0NhbWJvZGlhKSkKCkNhbWJvZGlhX21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTE2LjcsIGIgPSAtMC4xLCBjID0gMTQwKSwgZGF0YSA9IENhbWJvZGlhX2RhdCkKCmNvZWYoc3VtbWFyeShDYW1ib2RpYV9tb2QpKQoKcGxvdChDYW1ib2RpYV9kYXQkTnVtX0RheXNfU2luY2VfU3RhcnQsQ2FtYm9kaWFfZGF0JENvbmZpcm1lZCx4bGFiID0gIk51bWJlciBvZiBEYXlzIFNpbmNlIFN0YXJ0Iix5bGFiID0gIk51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMiLG1haW4gPSAiTG9naXN0aWMgUmVncmVzc2lvbiBmb3IgQ2FtYm9kaWEiKQpjdXJ2ZSgxMTcuMDEvKDErMS42NTY1ODRlKzA4KmV4cCh4Ki0wLjM0NSkpLCBjb2wgPSA0LCBhZGQgPSBUUlVFKQojbGluZXMoQ2FtYm9kaWFfZGF0JE51bV9EYXlzX1NpbmNlX1N0YXJ0LCBwcmVkaWN0KENhbWJvZGlhX21vZCksIGNvbCA9IDIpCmBgYAoKYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJQYW5hbWEiIHwgQ291bnRyeV9SZWdpb24gPT0gIk5vcndheSJ8IENvdW50cnlfUmVnaW9uID09ICJHZW9yZ2lhInxDb3VudHJ5X1JlZ2lvbiA9PSAiQmFuZ2xhZGVzaCJ8Q291bnRyeV9SZWdpb24gPT0gIkd1aW5lYSIpJT4lIGdyb3VwX2J5KERhdGUsQ291bnRyeV9SZWdpb24pJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGNvbG9yID0gQ291bnRyeV9SZWdpb24pKStnZW9tX2xpbmUoKStnZ3RpdGxlKCJDb25maXJtZWQgQ2FzZXMgYWNyb3NzIHRoZSBXb3JsZCIpCmBgYAoKI0p1bmsKYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJCcmF6aWwiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkJyYXppbCBDYXNlcyBhbmQgRGVhdGhzIikKYGBgCgo=